import { login, getProfile, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
const state = {
  // 2.state定义token变量,短路运算,有就直接拿储存的,没有就是空
  token: localStorage.getItem('token') || '',
  // 定义vuex变量来储存登录后请求的用户信息
  profile: null
}
const mutations = {
  // 3. 修改state.token的变量,data用于接收参数
  setToken(state, data) {
    // 本地储存token
    localStorage.setItem('token', data)
    state.token = data
  },
  // 请求用户信息修改储存到profile
  setProfile(state, data) {
    state.profile = data
  },
  // 退出清空token
  removeToken(state) {
    state.token = ''
    localStorage.removeItem('token')
  },
  // 退出清除profile
  removeProfile(state) {
    state.profile = null
  }
}
const actions = {
  // 1. 异步操作,调用登录接口
  // store当前仓库的实例,data调用时的传参
  async login(store, data) {
    // 拿到的res实际是响应拦截器发送的res.data.data
    const res = await login(data)
    // 4.调用mutations里的操作函数,传入参数
    store.commit('setToken', res)
    // 存储登录时间
    localStorage.setItem('loginTime', Date.now())
  },
  // 实例对象调用请求用户数据接口
  async getProfile(store) {
    // 调用接口获取用户基础数据
    const res = await getProfile()
    // 调用接口获取用户详细信息
    // console.log(res)
    const newRes = await getUserDetailById(res.userId)
    // 调用mutations里setProfile函数让其开启修改
    // 两个数据一起传输,使用拓展符 ...res,...newRes
    store.commit('setProfile', {
      ...res,
      ...newRes
    })
  },
  // 退出清除数据操作
  logout(store) {
    store.commit('removeToken')
    store.commit('removeProfile')
    // 路由残留问题    退出登录时,我们也需要清除一下高权限的路由数组,防止其他账号登录叠加之前账号的权限,造成bug,我们也可调用花裤衩封装好的路由清除函数来清除,这是业界内较为规范的方法函数(router/index)
    resetRouter()
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
